package plp.prolog;

import java.util.ArrayList;
import java.util.Arrays;

import plp.prolog.declaration.Atomo;
import plp.prolog.declaration.ExpressaoAnd;
import plp.prolog.declaration.ExpressaoOr;
import plp.prolog.declaration.Fato;
import plp.prolog.declaration.Predicado;
import plp.prolog.declaration.Questao;
import plp.prolog.declaration.Termo;
import plp.prolog.declaration.ValorInteiro;
import plp.prolog.declaration.Variavel;

public class Exemplos {

	public static void main(String [] args){
		
		/*
		 *  MAE(maria,carlos).
		 *	PAI(jose,carlos).
		 *	HOMEM(carlos).
		 *	MULHER(maria).
		 *	in
		 *	? PAI (jose,carlos).
		 */
		
		System.out.println("===========================================================");
		Atomo maria = new Atomo("maria");
		Atomo carlos = new Atomo("carlos");
		Predicado mae = new Predicado("MAE");
		Fato fato1p1 = new Fato(mae, new ArrayList<Termo>(Arrays.asList(maria,carlos)));
		
		Atomo jose = new Atomo("jose");
		Predicado pai = new Predicado("PAI");
		Fato fato2p1 = new Fato(pai, new ArrayList<Termo>(Arrays.asList(jose,carlos)));
		
		Predicado homem = new Predicado("HOMEM");
		Fato fato3p1 = new Fato(homem, new ArrayList<Termo>(Arrays.asList(carlos)));
		
		Predicado mulher = new Predicado("MULHER");
		Fato fato4p1 = new Fato(mulher, new ArrayList<Termo>(Arrays.asList(maria)));
		
		Fato fatoQuestaop1 = new Fato(pai, new ArrayList<Termo>(Arrays.asList(jose, carlos)));
		
		Questao questaop1 = new Questao(fatoQuestaop1);
		
		Programa p1 = new Programa(new ArrayList<Fato>(Arrays.asList(fato1p1, fato2p1,fato3p1,fato4p1)), questaop1);
		p1.executar();
		
		/*
		 * POSICAO(mala, 15, 17).
		 * in
		 * ? POSICAO(mala, X, Y).
		 */
		System.out.println("===========================================================");
		Atomo mala = new Atomo("mala");
		ValorInteiro valor15 = new ValorInteiro(15);
		ValorInteiro valor17 = new ValorInteiro(17);
		Predicado posicao = new Predicado("POSICAO");
		Fato fato1p2 = new Fato(posicao, new ArrayList<Termo>(Arrays.asList(mala,valor15,valor17)));
		
		Variavel variavelXp2 = new Variavel("X");
		Variavel variavelYp2 = new Variavel("Y");
		Fato fatoQuestaop2 = new Fato(posicao, new ArrayList<Termo>(Arrays.asList(mala, variavelXp2, variavelYp2)));
		
		Questao questaop2 = new Questao(fatoQuestaop2);
		
		Programa p2 = new Programa(new ArrayList<Fato>(Arrays.asList(fato1p2)), questaop2);
		p2.executar(); 
		
		/*
		 * AMIGO(marcio, marcos).
		 * AMIGO(marcio, joana).
		 * in
		 * AMIGO(X, marcos), AMIGO(X,joana)
		 */
		System.out.println("===========================================================");
		Atomo marcio = new Atomo("marcio");
		Atomo marcos = new Atomo("marcos");
		Predicado amigo = new Predicado("AMIGO");
		Fato fato1p3 = new Fato(amigo, new ArrayList<Termo>(Arrays.asList(marcio, marcos)));
		
		Atomo joana = new Atomo("joana");
		Fato fato2p3 = new Fato(amigo, new ArrayList<Termo>(Arrays.asList(marcio, joana)));
		
		Variavel variavelXp3 = new Variavel("X");
		Fato fatoEsquerda = new Fato(amigo, new ArrayList<Termo>(Arrays.asList(variavelXp3, marcos)));
		Fato fatoDireita = new Fato(amigo, new ArrayList<Termo>(Arrays.asList(variavelXp3, joana)));
		ExpressaoAnd expressaoAndp3 = new ExpressaoAnd(new ArrayList<Fato>(Arrays.asList(fatoEsquerda, fatoDireita)));
		
		Questao questaop3 = new Questao(expressaoAndp3);
		
		Programa p3 = new Programa(new ArrayList<Fato>(Arrays.asList(fato1p3,fato2p3)), questaop3);
		p3.executar();
		
		
		/*
		 * CONVERSA(eduardo, marlon).
		 * CONVERSA(eduardo, bruno).
		 * in
		 * CONVERSA(eduardo, X); CONVERSA(Y, eduardo)
		 */
		System.out.println("===========================================================");
		Atomo eduardop4 = new Atomo("eduardo");
		Atomo marlonp4 = new Atomo("marlon");
		Predicado conversap4 = new Predicado("CONVERSA");
		Fato fato1p4 = new Fato(conversap4, new ArrayList<Termo>(Arrays.asList(eduardop4, marlonp4)));
		
		Atomo brunop4 = new Atomo("bruno");
		Fato fato2p4 = new Fato(conversap4, new ArrayList<Termo>(Arrays.asList(eduardop4, brunop4)));

		Variavel variavelXp4 = new Variavel("X");
		Variavel variavelYp4 = new Variavel("Y");
		Fato fatoEsquerdap4 = new Fato(conversap4, new ArrayList<Termo>(Arrays.asList(eduardop4, variavelXp4)));
		Fato fatoDireitap4 = new Fato(conversap4, new ArrayList<Termo>(Arrays.asList(variavelYp4, eduardop4)));
		
		ExpressaoOr expressaoQuestaop4 = new ExpressaoOr(new ArrayList<Fato>(Arrays.asList(fatoEsquerdap4, fatoDireitap4)));

		Questao questaop4 = new Questao(expressaoQuestaop4);
				
		Programa p4 = new Programa(new ArrayList<Fato>(Arrays.asList(fato1p4,fato2p4)), questaop4);
		p4.executar();
		
		/*
		 * PERTENCE(alicate, pedro)
		 * in
		 * PERTENCE(alicate, renato)
		 */
		System.out.println("===========================================================");
		Atomo alicatep5 = new Atomo("alicate");
		Atomo pedrop5 = new Atomo("pedro");
		Predicado pertencep5 = new Predicado("PERTENCE");
		Fato fato1p5 = new Fato(pertencep5, new ArrayList<Termo>(Arrays.asList(alicatep5, pedrop5)));
		
		Atomo renatop5 = new Atomo("renato");
		Fato fatoQuestaop5 = new Fato(pai, new ArrayList<Termo>(Arrays.asList(alicatep5, renatop5)));
		
		Questao questaop5 = new Questao(fatoQuestaop5);
		
		Programa p5 = new Programa(new ArrayList<Fato>(Arrays.asList(fato1p5)), questaop5);
		p5.executar();
		
		/*
		 * PERTENCE(X, pedro)
		 * PERTENCE(alicate, Y)
		 * in
		 * PERTENCE(alicate, pedro)
		 */
		System.out.println("===========================================================");
		Variavel variavelXp6 = new Variavel("X");
		Atomo pedrop6 = new Atomo("pedro");
		
		Atomo alicatep6 = new Atomo("alicate");
		Variavel variavelYp6 = new Variavel("Y");
		
		Predicado pertencep6 = new Predicado("PERTENCE");
		
		Fato fato1p6 = new Fato(pertencep6, new ArrayList<Termo>(Arrays.asList(variavelXp6, pedrop6)));
		
		Fato fato2p6 = new Fato(pertencep6, new ArrayList<Termo>(Arrays.asList(alicatep6, variavelYp6)));
		
		Fato fatoQuestaop6 = new Fato(pertencep6, new ArrayList<Termo>(Arrays.asList(alicatep6, pedrop6)));
		
		Questao questaop6 = new Questao(fatoQuestaop6);
		
		Programa p6 = new Programa(new ArrayList<Fato>(Arrays.asList(fato1p6, fato2p6)), questaop6);
		p6.executar();
		
		/*
		 * PERTENCE(alicate, pedro)
		 * in
		 * PERTENCE(X, pedro), PERTENCE(alicate, Y)
		 */
		System.out.println("===========================================================");
		
		Atomo alicatep7 = new Atomo("alicate");
		Atomo pedrop7 = new Atomo("pedro");
		Predicado pertencep7 = new Predicado("PERTENCE");

		Fato fato1p7 = new Fato(pertencep7, new ArrayList<Termo>(Arrays.asList(alicatep7, pedrop7)));
		
		Variavel variavelYp7 = new Variavel("Y");
		Variavel variavelXp7 = new Variavel("X");
		
		Fato fatoEsquerdap7 = new Fato(pertencep7, new ArrayList<Termo>(Arrays.asList(variavelXp7, pedrop7)));
		
		Fato fatoDireitap7 = new Fato(pertencep7, new ArrayList<Termo>(Arrays.asList(alicatep7, variavelYp7)));
		
		ExpressaoOr expressaoOrp7 = new ExpressaoOr(new ArrayList<Fato>(Arrays.asList(fatoEsquerdap7, fatoDireitap7)));
				
		Questao questaop7 = new Questao(expressaoOrp7);
		
		Programa p7 = new Programa(new ArrayList<Fato>(Arrays.asList(fato1p7)), questaop7);
		p7.executar();
		
		
	}

	
	
}
